﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Sustainalytics.Entities.ESGRatings;
using Sustainalytics.ESGComputing.Service.Tests;
using Sustainalytics.ESGRatings.BusinessLogic.Computing.Entities;
using Sustainalytics.ESGRatings.Computing.Entities;
using CompanyWeights = Sustainalytics.ESGRatings.Computing.Entities.ESG.CompanyWeights;
using ReferenceUniverse = Sustainalytics.ESGRatings.Computing.Entities.ESG.ReferenceUniverse;
using ReferenceUniverseCompany = Sustainalytics.ESGRatings.Computing.Entities.ESG.ReferenceUniverseCompany;
using WeightMatrix = Sustainalytics.ESGRatings.Computing.Entities.ESG.WeightMatrix;

namespace Sustainalytics.ESGRatings.BusinessLogic.Computing
{
    public class CudaManager
    {
      public static void Main()
       {
//            //ComputationEngineDeleteTests test = new ComputationEngineDeleteTests();
//            //var result = test.TwoSetsRemoveFirst();
//            //Debug.Assert(result, "result is false");

//            //ComputationEngineTests test = new ComputationEngineTests();
//            //var result = test.TwoCompaniesInSameUniverseTest();
//            //Debug.Assert(result.Ratings!=null, "result is false");

//            //var test = new ComputationEngineThreeCompaniesTests();
//            //var result = test.TwoCompaniesInSameUniverseTest();
//            //Debug.Assert(result.Ratings != null, "result is false");
//            //result.Dispose();

//            //var test2=new ComputationEngineTestWithEsgDataHelper();
//            //var result2 = test2.GetGompaniesRatingsResult();

//            //Debug.Assert(result2.Ratings != null, "result is false");

//            //result2.Dispose();
 }

        public void PushReferenceUniverse(List<ReferenceUniverse> universes)
        {
            if (universes == null || universes.Count == 0)
            {
            }
        }
    }

//    public class ComputationEngineTests
//    {
//        private readonly IList<Guid> _companyIds = new[]
//        {
//            Guid.NewGuid(),
//            Guid.NewGuid()
//        };

//        private readonly IList<Guid> _matrixId = new[]
//        {
//           new Guid("3d070700-6668-4ae0-9fa5-505820d2d96e")
//        };

//        public ESGComputeResult TwoCompaniesInSameUniverseTest()
//        {
//            var indicatorsConfiguration = GetIndicatorConfiguration();
//            var ce = GetCorporateData();

//            ESGComputeResult result;

//            using (var engine = ComputationEngine.Instance)
//            {
//                engine.AddESGSet(null, ce, indicatorsConfiguration);
//                List<WeightMatrix> weightMatrix = GetWeightMatrix();

//                var companiesIndicators = GetIndicatorsData();
//                engine.SetIndicatorsData(Guid.Empty, companiesIndicators.Select(x => new CompanyRawScores(x.CompanyId, x.Data.Select(y => new RawScore(y.Key, (int)y.Value)))).ToList());

//                engine.AddMatrices(_matrixId[0],weightMatrix);

//                List<ReferenceUniverse> referenceUniverse = GetReferenceUniverse();

//                engine.AddUniverses(Guid.Empty, referenceUniverse);

//                result = engine.ComputeESGRatings(_matrixId[0], referenceUniverse[0].Id, ComparativeGroupEnum.PeerGroup);
//            }

//            return result;
//        }

//        private List<ReferenceUniverse> GetReferenceUniverse()
//        {
//            return new List<ReferenceUniverse>()
//            {
//                new ReferenceUniverse
//                {
//                    Id = Guid.NewGuid(),
//                    Companies = new[]
//                    {
//                        new ReferenceUniverseCompany
//                        {
//                            CapitalIQID = "IQ20704112",
//                            CompanyId = _companyIds[0],
//                            CompanyName = "Compania1"
//                        },
//                        new ReferenceUniverseCompany
//                        {
//                            CapitalIQID = "IQ20704113",
//                            CompanyId = _companyIds[1],
//                            CompanyName = "Compania2"
//                        }
//                    }
//                }
//            };
//        }
//    }

//        private List<WeightMatrix> GetWeightMatrix()
//        {
//            return new List<WeightMatrix>{ 
//               new WeightMatrix
//            {
//                AccountId = Guid.NewGuid(),
//                MatrixId = _matrixId[0],
//                CompaniesWeights = new[]
//                {
//                    new CompanyWeights
//                        (
//                        _companyIds[0],
//                        new Dictionary<string, float>
//                        {
//                            {"E.1.1", 0.1f},
//                            {"E.1.2", 0},
//                            {"E.1.12", 0.15f},
//                            {"E.2.2", 0},
//                            {"E.1.4", 0},
//                            {"G.1.4", 0},
//                            {"G.1.1", 0.2f},
//                            {"S.1.1", 0.25f},
//                            {"S.1.2", 0.3f}
//                        }.Select(x => new Weight(x.Key, x.Value))
                        
//                        ),

//                    new CompanyWeights
//                        (
//                         _companyIds[1],
//                        new Dictionary<string, float>
//                        {
//                            {"E.1.1", 0},
//                            {"E.1.2", 0},
//                            {"E.1.12", 0.1f},
//                            {"E.2.2", 0.15f},
//                            {"E.1.4", 0.1f},
//                            {"G.1.4", 0.15f},
//                            {"G.1.1", 0.15f},
//                            {"S.1.1", 0.23f},
//                            {"S.1.2", 0.12f}
//                        }.Select(x => new Weight(x.Key, x.Value))
                       
//                        )
//                }
//}
//            };
//        }

//        private ICollection<ESGCompanyEntity> GetCorporateData()
//        {
//            List<ESGCompanyEntity> companies = new List<ESGCompanyEntity>
//            {
//                new ESGCompanyEntity
//                {
//                    Id = _companyIds[0],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                },
//                new ESGCompanyEntity
//                {
//                     Id = _companyIds[1],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                }
//            };
//            return companies;
//        }

//        private IndicatorTemplate[] GetIndicatorConfiguration()
//        {
//            IndicatorTemplate[] builder =
//            {
//                new IndicatorTemplate("E.1.1", "E", "P​​"),
//                new IndicatorTemplate("E.1.2",
//                    "E", "P​​"),
//                new IndicatorTemplate("E.1.12",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.2.2",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.1.4",
//                    "E", "QNP"),
//                new IndicatorTemplate("G.1.4",
//                    "G", "D"),
//                new IndicatorTemplate("G.1.1",
//                    "G", "P​​"),
//                new IndicatorTemplate("S.1.1",
//                    "S", "P​​"),
//                new IndicatorTemplate("S.1.2",
//                    "S", "QLP")
//            };
//            return builder;
//        }

//        private List<IndicatorsData> GetIndicatorsData()
//        {
//            return new List<IndicatorsData>
//            {
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[0],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 100),
//                        new KeyValuePair<string, float>("E.1.2", 0),
//                        new KeyValuePair<string, float>("E.1.12", 50),
//                        new KeyValuePair<string, float>("E.2.2", 20),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 90),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                },
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[1],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 50),
//                        new KeyValuePair<string, float>("E.1.2", 40),
//                        new KeyValuePair<string, float>("E.1.12", 100),
//                        new KeyValuePair<string, float>("E.2.2", 100),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 80),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                }
//            };
//        }

//        //private ESGRatingsOptions.CompanyAttributesEnum GetDefaultProfileComputingEnum(TemplateTypeEnum templateType,
//        //   CompanyTypeEnum companyTypeEnum)
//        //{
//        //    ESGRatingsOptions.CompanyAttributesEnum attributes = default(ESGRatingsOptions.CompanyAttributesEnum);

//        //    if (companyTypeEnum == CompanyTypeEnum.Public)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (companyTypeEnum == CompanyTypeEnum.Private)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private;

//        //    if (companyTypeEnum == CompanyTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private | ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (templateType == TemplateTypeEnum.Type_A)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA;

//        //    if (templateType == TemplateTypeEnum.Type_B)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    if (templateType == TemplateTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA | ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    return attributes;
//        //}

//        //private GroupingOptionsEnum GetDefaultProfileGroupByComputingEnum(ComparativeGroupEnum comparativeGroup)
//        //{
//        //    if (comparativeGroup == ComparativeGroupEnum.IndustryGroup)
//        //        return GroupingOptionsEnum.GroupByIdustryGroup;

//        //    return GroupingOptionsEnum.GroupByPeerGroup;
//        //}
//    }

//    public class ComputationEngineDeleteTests
//    {
//        private readonly IList<Guid> _companyIds = new[]
//        {
//            Guid.NewGuid(),
//            Guid.NewGuid()
//        };

//        private readonly IList<Guid> _matrixId = new[]
//        {
//           new Guid("3d070700-6668-4ae0-9fa5-505820d2d96e")
//        };

//        public bool TwoSetsRemoveFirst()
//        {
//            var indicatorsConfiguration = GetIndicatorConfiguration();
//            var ce = GetCorporateData();

//            bool result;

//            using (var engine = ComputationEngine.Instance)
//            {
//                Guid guid1 = Guid.NewGuid();
//                Guid guid2 = Guid.NewGuid();
//                engine.AddESGSet(guid1, ce, indicatorsConfiguration);
//                var weightMatrix = GetWeightMatrix();

//                var companiesIndicators = GetIndicatorsData();
//                engine.SetIndicatorsData(guid1, companiesIndicators.Select(x => new CompanyRawScores(x.CompanyId, x.Data.Select(y => new RawScore(y.Key, (int)y.Value)))));
//                var referenceUniverse = GetReferenceUniverse();

//                engine.AddMatrix(guid1, weightMatrix);

//                engine.AddUniverse(guid1, referenceUniverse);

//                engine.AddESGSet(guid2, ce, indicatorsConfiguration);

//                engine.SetIndicatorsData(guid2, companiesIndicators.Select(x => new CompanyRawScores(x.CompanyId, x.Data.Select(y => new RawScore(y.Key, (int)y.Value)))));

//                engine.AddMatrix(guid2, weightMatrix);

//                engine.AddUniverse(guid2, referenceUniverse);

//                result = engine.DeleteSet(guid1);
//            }
//            return result;
//        }

//        private ReferenceUniverse GetReferenceUniverse()
//        {
//            return new ReferenceUniverse
//            {
//                Id = Guid.NewGuid(),
//                Companies = new[]
//                {
//                    new ReferenceUniverseCompany {CapitalIQID = "IQ20704112", CompanyId = _companyIds[0],CompanyName = "Compania1"},
//                    new ReferenceUniverseCompany {CapitalIQID = "IQ20704113", CompanyId = _companyIds[1],CompanyName = "Compania2"}
//                }
//            };
//        }

//        private WeightMatrix GetWeightMatrix()
//        {
//            return new WeightMatrix
//            {
//                AccountId = Guid.NewGuid(),
//                MatrixId = _matrixId[0],
//                CompaniesWeights = new[]
//                {
//                    new CompanyWeights
//                        (
//                         _companyIds[0],
//                        new Dictionary<string, float>
//                        {
//                            {"E.1.1", 0.1f},
//                            {"E.1.2", 0},
//                            {"E.1.12", 0.15f},
//                            {"E.2.2", 0},
//                            {"E.1.4", 0},
//                            {"G.1.4", 0},
//                            {"G.1.1", 0.2f},
//                            {"S.1.1", 0.25f},
//                            {"S.1.2", 0.3f}
//                        }.Select(x => new Weight(x.Key, x.Value))
                       
//                        ),

//                    new CompanyWeights
//                        (
//                        _companyIds[1],
//                        new Dictionary<string, float>
//                        {
//                            {"E.1.1", 0},
//                            {"E.1.2", 0},
//                            {"E.1.12", 0.1f},
//                            {"E.2.2", 0.15f},
//                            {"E.1.4", 0.1f},
//                            {"G.1.4", 0.15f},
//                            {"G.1.1", 0.15f},
//                            {"S.1.1", 0.23f},
//                            {"S.1.2", 0.12f}
//                        }.Select(x => new Weight(x.Key, x.Value))
                        
//                        )
//                }
//            };
//        }

//        private ICollection<CompanyEntity> GetCorporateData()
//        {
//            List<CompanyEntity> companies = new List<CompanyEntity>
//            {
//                new CompanyEntity
//                {
//                    Id = _companyIds[0],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                },
//                new CompanyEntity
//                {
//                     Id = _companyIds[1],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                }
//            };
//            return companies;
//        }

//        private IndicatorTemplate[] GetIndicatorConfiguration()
//        {
//            IndicatorTemplate[] builder =
//            {
//                new IndicatorTemplate("E.1.1", "E", "P​​"),
//                new IndicatorTemplate("E.1.2",
//                    "E", "P​​"),
//                new IndicatorTemplate("E.1.12",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.2.2",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.1.4",
//                    "E", "QNP"),
//                new IndicatorTemplate("G.1.4",
//                    "G", "D"),
//                new IndicatorTemplate("G.1.1",
//                    "G", "P​​"),
//                new IndicatorTemplate("S.1.1",
//                    "S", "P​​"),
//                new IndicatorTemplate("S.1.2",
//                    "S", "QLP")
//            };
//            return builder;
//        }

//        private List<IndicatorsData> GetIndicatorsData()
//        {
//            return new List<IndicatorsData>
//            {
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[0],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 100),
//                        new KeyValuePair<string, float>("E.1.2", 0),
//                        new KeyValuePair<string, float>("E.1.12", 50),
//                        new KeyValuePair<string, float>("E.2.2", 20),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 90),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                },
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[1],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 50),
//                        new KeyValuePair<string, float>("E.1.2", 40),
//                        new KeyValuePair<string, float>("E.1.12", 100),
//                        new KeyValuePair<string, float>("E.2.2", 100),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 80),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                }
//            };
//        }

//        //private ESGRatingsOptions.CompanyAttributesEnum GetDefaultProfileComputingEnum(TemplateTypeEnum templateType,
//        //   CompanyTypeEnum companyTypeEnum)
//        //{
//        //    ESGRatingsOptions.CompanyAttributesEnum attributes = default(ESGRatingsOptions.CompanyAttributesEnum);

//        //    if (companyTypeEnum == CompanyTypeEnum.Public)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (companyTypeEnum == CompanyTypeEnum.Private)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private;

//        //    if (companyTypeEnum == CompanyTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private | ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (templateType == TemplateTypeEnum.Type_A)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA;

//        //    if (templateType == TemplateTypeEnum.Type_B)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    if (templateType == TemplateTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA | ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    return attributes;
//        //}

//        //private GroupingOptionsEnum GetDefaultProfileGroupByComputingEnum(ComparativeGroupEnum comparativeGroup)
//        //{
//        //    if (comparativeGroup == ComparativeGroupEnum.IndustryGroup)
//        //        return GroupingOptionsEnum.GroupByIdustryGroup;

//        //    return GroupingOptionsEnum.GroupByPeerGroup;
//        //}
//    }

//    public class ComputationEngineThreeCompaniesTests
//    {
//        private readonly IList<Guid> _companyIds = new[]
//        {
//            Guid.NewGuid(),
//            Guid.NewGuid(),
//            Guid.NewGuid()
//        };

//        private readonly IList<Guid> _matrixId = new[]
//        {
//           new Guid("3d070700-6668-4ae0-9fa5-505820d2d96e")
//        };

//        public ESGComputeResult TwoCompaniesInSameUniverseTest()
//        {
//            var indicatorsConfiguration = GetIndicatorConfiguration();
//            var ce = GetCorporateData();

//            ESGComputeResult result;

//            using (var engine = ComputationEngine.Instance)
//            {
//                engine.AddESGSet(null, ce, indicatorsConfiguration);
//                var companiesIndicators = GetIndicatorsData();
//                var companyWeights = GetCompanyWeightsData();

//                var matrixWeights = from weight in companyWeights
//                                    select new CompanyWeights { CompanyId = weight.CompanyId, IndicatorsData = weight.IndicatorsData.Select(x => new Weight(x.Code, x.Value)) };

//                engine.SetIndicatorsData(Guid.Empty, companiesIndicators.Select(x => new CompanyRawScores(x.CompanyId, x.Data.Select(y => new RawScore(y.Key, (int)y.Value)))));

//                engine.AddMatrix(Guid.Empty, new WeightMatrix { AccountId = Guid.NewGuid(), MatrixId = _matrixId[0], CompaniesWeights = matrixWeights.ToArray() });

//                var referenceUniverse = GetReferenceUniverse();

//                engine.AddUniverse(Guid.Empty, referenceUniverse);

//                result = engine.ComputeESGRatings(_matrixId[0], referenceUniverse.Id, ComparativeGroupEnum.PeerGroup );
//            }

//            return result;
//        }

//        private ReferenceUniverse GetReferenceUniverse()
//        {
//            return new ReferenceUniverse
//            {
//                Id = Guid.NewGuid(),
//                Companies = new[]
//                {
//                    new ReferenceUniverseCompany {CapitalIQID = "IQ20704112", CompanyId = _companyIds[0],CompanyName = "Compania1"},
//                    new ReferenceUniverseCompany {CapitalIQID = "IQ20704113", CompanyId = _companyIds[1],CompanyName = "Compania2"}
//                }
//            };
//        }

//        private IEnumerable<CompanyWeights> GetCompanyWeightsData()
//        {
//            return new List<CompanyWeights>
//            {
//                new CompanyWeights
//                {
//                    CompanyId = _companyIds[0],

//                    IndicatorsData = new Dictionary<string, float>
//                    {
//                        {"E.1.1", 0.1f},
//                        {"E.1.2", 0},
//                        {"E.1.12", 0.15f},
//                        {"E.2.2", 0},
//                        {"E.1.4", 0},
//                        {"G.1.4", 0},
//                        {"G.1.1", 0.2f},
//                        {"S.1.1", 0.25f},
//                        {"S.1.2", 0.3f}
//                    }.Select(x=>new Weight(x.Key,x.Value))
//                },
//                new CompanyWeights
//                {
//                    CompanyId = _companyIds[1],

//                    IndicatorsData = new Dictionary<string, float>
//                    {
//                        {"E.1.1", 0},
//                        {"E.1.2", 0},
//                        {"E.1.12", 0.1f},
//                        {"E.2.2", 0.15f},
//                        {"E.1.4", 0.1f},
//                        {"G.1.4", 0.15f},
//                        {"G.1.1", 0.15f},
//                        {"S.1.1", 0.23f},
//                        {"S.1.2", 0.12f}
//                    }.Select(x=>new Weight(x.Key,x.Value))
//                },
//                new CompanyWeights
//                {
//                    CompanyId = _companyIds[2],
//                    IndicatorsData = new Dictionary<string, float>
//                    {
//                        {"E.1.1", 0},
//                        {"E.1.2", 0.05f},
//                        {"E.1.12", 0.1f},
//                        {"E.2.2", 0f},
//                        {"E.1.4", 0.00f},
//                        {"G.1.4", 0.1f},
//                        {"G.1.1", 0.2f},
//                        {"S.1.1", 0.25f},
//                        {"S.1.2", 0.3f}
//                    }.Select(x=>new Weight(x.Key,x.Value))
//                }
//            };
//        }

//        private ICollection<CompanyEntity> GetCorporateData()
//        {
//            List<CompanyEntity> companies = new List<CompanyEntity>
//            {
//                new CompanyEntity
//                {
//                    Id = _companyIds[0],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                },
//                new CompanyEntity
//                {
//                     Id = _companyIds[1],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                }
//                ,new CompanyEntity
//                {
//                     Id = _companyIds[2],
//                    Attributes = ESGRatingsOptions.CompanyAttributesEnum.Public | ESGRatingsOptions.CompanyAttributesEnum.TypeA,
//                    IndustryGroup = "Diversified Financials",
//                    PeerGroup = "Diversified Financials"
//                }
//            };
//            return companies;
//        }

//        private IndicatorTemplate[] GetIndicatorConfiguration()
//        {
//            IndicatorTemplate[] builder =
//            {
//                new IndicatorTemplate("E.1.1", "E", "P​​"),
//                new IndicatorTemplate("E.1.2",
//                    "E", "P​​"),
//                new IndicatorTemplate("E.1.12",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.2.2",
//                    "E", "QLP"),
//                new IndicatorTemplate("E.1.4",
//                    "E", "QNP"),
//                new IndicatorTemplate("G.1.4",
//                    "G", "D"),
//                new IndicatorTemplate("G.1.1",
//                    "G", "P​​"),
//                new IndicatorTemplate("S.1.1",
//                    "S", "P​​"),
//                new IndicatorTemplate("S.1.2",
//                    "S", "QLP")
//            };
//            return builder;
//        }

//        private List<IndicatorsData> GetIndicatorsData()
//        {
//            return new List<IndicatorsData>
//            {
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[0],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 100),
//                        new KeyValuePair<string, float>("E.1.2", 0),
//                        new KeyValuePair<string, float>("E.1.12", 50),
//                        new KeyValuePair<string, float>("E.2.2", 20),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 90),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                },
//                new IndicatorsData
//                {
//                    CompanyId = _companyIds[1],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 50),
//                        new KeyValuePair<string, float>("E.1.2", 40),
//                        new KeyValuePair<string, float>("E.1.12", 100),
//                        new KeyValuePair<string, float>("E.2.2", 100),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 80),
//                        new KeyValuePair<string, float>("G.1.1", 50),
//                        new KeyValuePair<string, float>("S.1.1", 20),
//                        new KeyValuePair<string, float>("S.1.2", 30)
//                    }
//                },
//                 new IndicatorsData
//                 {
//                    CompanyId = _companyIds[2],
//                    Data = new[]
//                    {
//                        new KeyValuePair<string, float>("E.1.1", 0),
//                        new KeyValuePair<string, float>("E.1.2", 10),
//                        new KeyValuePair<string, float>("E.1.12", 20),
//                        new KeyValuePair<string, float>("E.2.2", 0),
//                        new KeyValuePair<string, float>("E.1.4", 0),
//                        new KeyValuePair<string, float>("G.1.4", 50),
//                        new KeyValuePair<string, float>("G.1.1", 75),
//                        new KeyValuePair<string, float>("S.1.1", 25),
//                        new KeyValuePair<string, float>("S.1.2", 75)
//                    }
//                }
//            };
//        }

//        //private ESGRatingsOptions.CompanyAttributesEnum GetDefaultProfileComputingEnum(TemplateTypeEnum templateType,
//        //   CompanyTypeEnum companyTypeEnum)
//        //{
//        //    ESGRatingsOptions.CompanyAttributesEnum attributes = default(ESGRatingsOptions.CompanyAttributesEnum);

//        //    if (companyTypeEnum == CompanyTypeEnum.Public)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (companyTypeEnum == CompanyTypeEnum.Private)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private;

//        //    if (companyTypeEnum == CompanyTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.Private | ESGRatingsOptions.CompanyAttributesEnum.Public;

//        //    if (templateType == TemplateTypeEnum.Type_A)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA;

//        //    if (templateType == TemplateTypeEnum.Type_B)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    if (templateType == TemplateTypeEnum.Combined)
//        //        attributes |= ESGRatingsOptions.CompanyAttributesEnum.TypeA | ESGRatingsOptions.CompanyAttributesEnum.TypeB;

//        //    return attributes;
//        //}

//        //private GroupingOptionsEnum GetDefaultProfileGroupByComputingEnum(ComparativeGroupEnum comparativeGroup)
//        //{
//        //    if (comparativeGroup == ComparativeGroupEnum.IndustryGroup)
//        //        return GroupingOptionsEnum.GroupByIdustryGroup;

//        //    return GroupingOptionsEnum.GroupByPeerGroup;
//        //}
//    }

//    //    public class ComputationEngineTestWithEsgDataHelper
//    //    {
//    //        private readonly IESGComputeContext _context = ESGContextLoader.Instance.CreateComputeContext();

//    //        private static void IndicatorRatings_Parallel(int companiesCount, int indicatorsCount, float[] indicatorScores,
//    //            float[] indicatorRatings, float[] matrix)
//    //        {
//    //            Stopwatch watch = new Stopwatch();

//    //            watch.Start();
//    //            int repeatCount = 1;
//    //            for (int k = 0; k < repeatCount; k++)
//    //            {
//    //                Parallel.For(0, indicatorsCount, i =>
//    //                {
//    //                    for (int j = 0; j < companiesCount; j++)
//    //                    {
//    //                        int index = i + j*companiesCount;
//    //                        indicatorRatings[j] = indicatorScores[j]*matrix[j];
//    //                    }
//    //                });
//    //            }

//    //            watch.Stop();

//    //            Console.WriteLine("Indicators Ratings Parallel =  {0} ms", (double) watch.ElapsedMilliseconds/repeatCount);
//    //        }

//    //        private static void IndicatorRatings_test(out IESGComputeContext context)
//    //        {
//    //            context = ESGContextLoader.Instance.CreateComputeContext();

//    //        }

//    //        private static void IndicatorRatings(int companiesCount, int indicatorsCount, float[] indicatorScores,
//    //            float[] indicatorRatings, float[] matrix)
//    //        {
//    //            Stopwatch watch = new Stopwatch();

//    //            watch.Start();
//    //            int repeatCount = 1;
//    //            for (int k = 0; k < repeatCount; k++)
//    //            {
//    //                for (int i = 0; i <= indicatorsCount; i++)
//    //                {
//    //                    for (int j = 0; j < companiesCount; j++)
//    //                    {
//    //                        int index = i + j*companiesCount;
//    //                        indicatorRatings[j] = indicatorScores[j]*matrix[j];
//    //                    }
//    //                }
//    //            }

//    //            watch.Stop();

//    //            Console.WriteLine("Indicators Ratings =  {0} ms", (double) watch.ElapsedMilliseconds/repeatCount);
//    //        }

//    //        public RatingsResult GetGompaniesRatingsResult()
//    //        {
//    //            int companiesCount = Convert.ToInt32(2); //70 000 companies

//    //            Console.WriteLine("companiesCount: {0}", companiesCount);

//    //            int indicatorsCount = 150;

//    //            int[] groupsHeads = {};
//    //            float[] indicatorScores = new float[indicatorsCount*companiesCount];
//    //            float[] indicatorRatings = new float[indicatorsCount*companiesCount];
//    //            float[] matrix = new float[indicatorsCount*companiesCount];
//    //            byte[] universe = new byte[companiesCount];
//    //            byte[] attributes = new byte[companiesCount];

//    //            for (int i = 0; i < companiesCount; i++)
//    //            {
//    //                universe[i] = 1;
//    //                attributes[i] = 1;
//    //            }

//    //            indicatorScores[0] = 1;
//    //            matrix[0] = 1;

//    //            IndicatorRatings_Parallel(companiesCount, indicatorsCount, indicatorScores, indicatorRatings, matrix);
//    //            IndicatorRatings(companiesCount, indicatorsCount, indicatorScores, indicatorRatings, matrix);

//    //            Stopwatch watch = new Stopwatch();

//    //            long time = 0;
//    //            int iterations = 1;
//    //            for (int i = 0; i < iterations; i++)
//    //            {
//    //                var cpuComute = new ESGCpuComputation();
//    //                ESGData esgRadomData = cpuComute.GetRandomESGDataWitoutContext(companiesCount);
//    //                esgRadomData.LoadDefaultIndicatorsConfiguration();
//    //                watch.Reset();
//    //                watch.Start();
//    //                cpuComute.CpuRatings(esgRadomData);
//    //                watch.Stop();
//    //                time += watch.ElapsedMilliseconds;
//    //            }
//    //            Console.WriteLine("CPU compute ratings: 1 iteration avg time: {0} ms", time/iterations);

//    //            Console.WriteLine(" \n ---- ");
//    //            var config = ESGData.GetDefaultConfiguration();

//    //            _context.AddCompanySet(1, companiesCount, groupsHeads, config.Count, config.DisjunctClustersCount,
//    //                config.ESGHeads, config.DisjunctClustersHeads, config.DisjunctClustersMap);
//    //            _context.SetIndicators(1, companiesCount, indicatorsCount, indicatorScores);

//    //            _context.AddMatrix(1, 1, indicatorsCount*companiesCount, matrix);
//    //            _context.AddUniverse(1, 1, companiesCount, universe);
//    //            _context.SetAttributes(1, companiesCount, attributes);

//    //            var result = _context.Ratings(1, 1, 1, 127, false);

//    //            foreach (var a in result.TimedSteps)
//    //            {
//    //                Console.WriteLine("{1} {0:0.##}", a.Milliseconds, a.Name);
//    //            }

//    //            _context.Dispose();
//    //            return result;
//    //        }
//    //    }
}